#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <thread>

using namespace std;

string toHex(pthread_t tid)
{
	char s[64];
	snprintf(s,sizeof(s),"%p",(char*)tid);
	return s;
}

void* pthreadroutine(void* args)
{
	const string name = (char*)args;
	while(1)
	{
		cout << name << " hello,I am a new pthread : " << toHex(pthread_self()) << endl;
		sleep(1);
	}
	return nullptr;
}

int main()
{
	pthread_t tid;
	pthread_create(&tid,nullptr,pthreadroutine,(void*)"pthread 1");

	pthread_join(tid,nullptr);
	return 0;
}



//c++11 本身也支持多线程 vs 原生线程库

// void* runf()
// {
// 	while(true){
// 		cout << "hello , I am a new pthread!" << endl;
// 		sleep(1);
// 	}
// }

// int main()
// {
// 	thread t1(runf);

// 	t1.join();
// 	return 0;
// }

// class Request{
// public:
// 	Request(const string& Threadname,int start,int end):
// 	_Threadname(Threadname),_start(start),_end(end)
// 	{}
// 	string _Threadname;
// 	int _start;
// 	int _end;
// };

// class Respons{
// public:
// 	Respons(int exit_code,int result):
// 	_exit_code(exit_code),_result(result)
// 	{}
// 	void run(Request* rq)
// 	{
// 		for(int i = rq->_start;i <= rq->_end;i++){
// 			cout << rq->_Threadname << " is running , every change " << i << endl;
// 			_result += i;
// 			usleep(100000);
// 		}
// 	}
// 	int _exit_code;
// 	int _result;
// };

// void* sumCnt(void* args)
// {
// 	Request* res = static_cast<Request*>(args);
// 	Respons* rsp = new Respons(0,0);
// 	rsp->run(res);

// 	delete(res);
// 	return rsp;
// }

// int main()
// {
// 	pthread_t tid;
// 	Request* rq = new Request("Thread 1",1,100);
// 	pthread_create(&tid,nullptr,sumCnt,rq);


// 	void * ret;
// 	pthread_join(tid,&ret);
// 	Respons* rsp = static_cast<Respons*>(ret);

// 	cout << "result: " << rsp->_result << "  exit code: " << rsp->_exit_code << endl;
// 	delete(rsp);
// 	return 0;
// }

// int g_val = 100;

// void show(const string& name)
// {
// 	cout << name << "say#" << " new process,pid:" << getpid() << endl;
// }


// void *pthreadRun(void* argc)
// {
// 	const char* name = (const char*)argc;
// 	int cnt = 0;
// 	while(1)
// 	{
// 		// cout << "I am a other process,pid : " << getpid() << endl;
// 		// show("[new process]");
// 		printf("%s say# pid:%d,g_val:%d,&g_val:%p\n",name ,getpid(),g_val,&g_val);
// 		sleep(1);
// 		cnt++;
// 		if(cnt == 5) break;
// 	}
// 	pthread_exit((void*)1);
// 	return nullptr;
// }

// int main()
// {
// 	// PTHREAD_CANCELED;
// 	pthread_t tid;
// 	pthread_create(&tid,nullptr,pthreadRun,(void*)"pthread 1"); // 不是系统调用
// 	// cout << sizeof(void*) << endl;
// 	sleep(1);
// 	pthread_cancel(tid);

// 	// while(1)
// 	// {
// 	// 	// cout << "I am a main process,pid : " << getpid() << endl;
// 	// 	// show("[main process]");
// 	// 	printf("main process say# pid:%d,g_val:%d,&g_val:%p\n",getpid(),g_val,&g_val);
// 	// 	sleep(1);
// 	// 	g_val++;
// 	// }
// 	// sleep(7);
// 	void* retval;
// 	int ret = pthread_join(tid,&retval);
// 	// if(ret != 0) exit(0);
// 	cout << "exit status:" << (long int)retval << endl;
// 	cout << "main thread quit ...." << endl;

// 	return 0;
// }
